home *** CD-ROM | disk | FTP | other *** search
Text File | 1992-06-19 | 12.0 KB | 304 lines | [TEXT/CCL2] |
- ;MCL code for fully functional prototypes of Flip A BNDL & Save A BNDL
- ;© 1992 - Michael S. Engber - All Rights Reserved
-
- (oou-dependencies :records-u
- :macptr-u
- :traps-u)
-
- (defun OSType-to-long (ostype)
- (rlet ((buf :OSType))
- (%put-ostype buf ostype)
- (%get-unsigned-long buf)))
-
- (defun long-to-OSType (long)
- (rlet ((buf :OSType))
- (%put-long buf long)
- (%get-ostype buf)))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;
-
-
- ;;Fills in the ProcessSerialNumber and FSSpec of the 1st process with
- ;;the specified signature & file type.
- ;;Returns t/nil indicating success/failure.
- ;;Based on sample code from IM VI p. 29-11
- (defun find-process (file-type signature psn fsspec)
-
- ;;Must coerce file-type to an in becuause the processType field of a
- ;; ProcessInfoRec is defined as a long for some reason
- (setf file-type (OSType-to-long file-type))
-
- ;;Must be sure that signature is a keyword so the eq test will work.
- ;; (OSTypes can be passed as keywords or 4-char strings)
- (setf signature (long-to-OSType (OSType-to-long signature)))
-
- (rlet ((pinfo :ProcessInfoRec
- :processInfoLength (rlength :ProcessInfoRec)
- :processName (%null-ptr)
- :processAppSpec fsspec))
- (pset psn :ProcessSerialNumber.highLongOfPSN 0)
- (pset psn :ProcessSerialNumber.lowLongOfPSN #$kNoProcess)
- (loop
- (unless (zerop (#_GetNextProcess psn)) (return))
- (when (and (zerop (#_GetProcessInformation psn pinfo))
- (= (pref pinfo :ProcessInfoRec.processType) file-type)
- (eq (pref pinfo :ProcessInfoRec.processSignature) signature))
- (return-from find-process t)))))
-
-
- ;;Launches the application specified by fsspec. It's process id is returned
- ;;in psn. If bring-to-front-p is non-nil, it's made the active application.
- ;;Returns t/nil indicating success/failure.
- (defun launch-app (fsspec psn bring-to-front-p)
- (let ((flags (+ #$launchContinue
- #$launchNoFileFlags
- (if bring-to-front-p 0 #$launchDontSwitch))))
- (rlet ((pb :LaunchParamBlockRec
- :launchBlockID #$extendedBlock
- :launchEPBLength #$extendedBlockLen
- :launchControlFlags flags
- :launchAppSpec fsspec
- :launchAppParameters (%null-ptr)))
- (when (zerop (#_LaunchApplication pb))
- (pset psn :ProcessSerialNumber (pref pb :LaunchParamBlockRec.launchProcessSN))
- t))))
-
- ;;Sends a quit Apple Event to the specified process
- (defun AE-send-quit (psn)
- (rlet ((ae-addr :AEAddressDesc)
- (ae :AppleEvent)
- (ae-reply :AppleEvent))
- (when (and (zerop (#_AECreateDesc #$typeProcessSerialNumber psn (rlength :ProcessSerialNumber) ae-addr))
- (zerop (#_AECreateAppleEvent #$kCoreEventClass #$kAEQuitApplication ae-addr 0 #$kAnyTransactionID ae)))
- (prog1
- (zerop (#_AESend ae ae-reply #$kAEWaitReply #$kAENormalPriority #$kNoTimeOut (%null-ptr) (%null-ptr)))
- (#_AEDisposeDesc ae-addr)
- (#_AEDisposeDesc ae)
- (#_AEDisposeDesc ae-reply)))))
-
- (defun restart-Finder ()
- (rlet ((fsspec :FSSpec)
- (psn :ProcessSerialNumber))
-
- ;;kill the FileSharing Extension if it's around
- (when (find-process "INIT" "hhgg" psn fsspec)
- (unless (AE-send-quit psn) (error "problem killing File Sharing Extension.")))
-
- ;;kill & restart the Finder
- (when (find-process "FNDR" "MACS" psn fsspec)
- (unless (AE-send-quit psn) "problem killing Finder.")
- (unless (launch-app fsspec psn t) (error "problem launching Finder"))
-
- ;;wait till Finder becomes the front process
- ;;(actually, this is only necessary if you're planning to ExitToShell right away)
- (rlet ((my-psn :ProcessSerialNumber)
- (flag :Boolean))
- (#_GetCurrentProcess my-psn)
- (loop
- (#_GetFrontProcess psn)
- (#_SameProcess psn my-psn flag)
- (unless (%get-boolean flag) (return t)))))))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;DTDB stuff
-
- (defun DTDB-p (vRefNum)
- (with-returned-pstrs ((name_p ""))
- (rlet ((vparams :GetVolParmsInfoBuffer)
- (pb :HParamBlockRec
- :ioVRefNum vRefNum
- :ioNamePtr name_p
- :ioBuffer vparams
- :ioReqCount (rlength :GetVolParmsInfoBuffer)))
- (trap-nz-echeck (#_PBHGetVolParms pb))
- (and
- (logbitp #$bHasDesktopMgr (pref vparams :GetVolParmsInfoBuffer.vMAttrib))
- (not (logbitp #$bHasExtFSVol (pref vparams :GetVolParmsInfoBuffer.vMAttrib)))))))
-
- (defun DTDB-vstrip-APPL (creator vRefNum)
- (let ((count 0))
- (with-returned-pstrs ((name_p ""))
- (rlet ((pb :DTPBRec
- :ioNamePtr name_p
- :ioVRefNum vRefNum
- :ioIndex 1
- :ioFileCreator creator))
- (trap-nz-echeck (#_PBDTGetPath pb))
- (loop
- (unless (zerop (#_PBDTGetAPPL pb))
- (unless (= (pref pb :DTPBRec.ioResult) #$afpItemNotFound)
- (error "error calling GetAPPL (~a)" (pref pb :DTPBRec.ioResult)))
- (when (plusp count)
- (#_PBDTFlush pb))
- (return count))
- (pset pb :DTPBRec.ioDirID (pref pb :DTPBRec.ioAPPLParID))
- (trap-nz-echeck (#_PBDTRemoveAPPL pb))
- (incf count))))))
-
- (defun DTDB-strip-APPL (creator)
- ;should use (#_GetVCBQHdr) or constant #$VCBQHdr = x0356
- (with-macptrs ((q-ptr (pref (%int-to-ptr #x0356) :QHdr.qHead)))
- (loop
- (when (%null-ptr-p q-ptr) (return))
- (when (DTDB-p (pref q-ptr :VCB.vcbVRefNum))
- (format t "~%stripping ~a, ~a BNDLs stripped"
- (pref q-ptr :VCB.vcbvn)
- (DTDB-vstrip-APPL creator (pref q-ptr :VCB.vcbVRefNum)))
- (%setf-macptr q-ptr (pref q-ptr :VCB.qLink))))))
-
- (defun DTDB-vshow-APPL (creator vRefNum)
- (with-returned-pstrs ((name_p ""))
- (rlet ((pb :DTPBRec
- :ioNamePtr name_p
- :ioVRefNum vRefNum
- :ioIndex 1
- :ioFileCreator creator))
- (trap-nz-echeck (#_PBDTGetPath pb))
- (loop
- (unless (zerop (#_PBDTGetAPPL pb))
- (#_PBDTFlush pb)
- (return (1- (pref pb :DTPBRec.ioIndex))))
- (pset pb :DTPBRec.ioDirID (pref pb :DTPBRec.ioAPPLParID))
- (format t "~%~2@s: fn = ~s, dirID = ~s"
- (pref pb :DTPBRec.ioIndex)
- (%get-string (pref pb :DTPBRec.ioNamePtr))
- (pref pb :DTPBRec.ioAPPLParID))
- (incf (pref pb :DTPBRec.ioIndex))))))
-
- (defun DTDB-show-APPL (creator)
- ;should use (#_GetVCBQHdr) or constant #$VCBQHdr = x0356
- (with-macptrs ((q-ptr (pref (%int-to-ptr #x0356) :QHdr.qHead)))
- (loop
- (when (%null-ptr-p q-ptr) (return))
- (when (DTDB-p (pref q-ptr :VCB.vcbVRefNum))
- (format t "~%----------~%volume = ~a" (pref q-ptr :VCB.vcbVN))
- (DTDB-vshow-APPL creator (pref q-ptr :VCB.vcbVRefNum))
- (terpri))
- (%setf-macptr q-ptr (pref q-ptr :VCB.qLink)))))
-
- (defun DTDB-icon-info (icon-type)
- (values
- (case icon-type
- ((#.#$kLargeIcon #.#$kLarge4BitIcon #.#$kLarge8BitIcon) 32)
- ((#.#$kSmallIcon #.#$kSmall4BitIcon #.#$kSmall8BitIcon) 16))
- (case icon-type
- ((#.#$kLargeIcon #.#$kSmallIcon) 1)
- ((#.#$kLarge4BitIcon #.#$kSmall4BitIcon) 4)
- ((#.#$kLarge8BitIcon #.#$kSmall8BitIcon) 8))))
-
- (defun DTDB-flip-icon (icon-buf icon-buf-size icon-type)
- (flet ((flip (icon-buf icon-buf-size rows)
- (let* ((row-bytes (round icon-buf-size rows))
- (nrow-bytes (- row-bytes)))
- (with-macptrs ((top-buf-ptr icon-buf)
- (bot-buf-ptr (%inc-ptr icon-buf (- icon-buf-size row-bytes))))
- (%stack-block ((row-buf row-bytes))
- (dotimes (i (round rows 2))
- (#_BlockMove top-buf-ptr row-buf row-bytes)
- (#_BlockMove bot-buf-ptr top-buf-ptr row-bytes)
- (#_BlockMove row-buf bot-buf-ptr row-bytes)
- (%incf-ptr top-buf-ptr row-bytes)
- (%incf-ptr bot-buf-ptr nrow-bytes)))))))
- (multiple-value-bind (rows depth) (DTDB-icon-info icon-type)
- (when (and rows depth)
- (unless (= (round icon-buf-size (if (= depth 1) 2 1)) (round (* rows rows depth) 8))
- (error "icon data seems wrong: type=~s rows=~s, depth=~s, buf-size = ~s"
- icon-type rows depth icon-buf-size))
- (cond
- ((= depth 1)
- (let ((half-buf-size (round icon-buf-size 2)))
- (flip icon-buf half-buf-size rows)
- (flip (%inc-ptr icon-buf half-buf-size) half-buf-size rows)))
- (t
- (flip icon-buf icon-buf-size rows)))))))
-
- (defun DTDB-vflip-APPL (creator vRefNum)
- (let ((count 0))
- (with-returned-pstrs ((name_p ""))
- (rlet ((pb :DTPBRec
- :ioNamePtr name_p
- :ioVRefNum vRefNum
- :ioIndex 1
- :ioFileCreator creator))
- (trap-nz-echeck (#_PBDTGetPath pb))
- (loop
- (unless (zerop (#_PBDTGetIconInfo pb))
- (unless (= (pref pb :DTPBRec.ioResult) #$afpItemNotFound)
- (error "error calling GetIconInfo (~a)" (pref pb :DTPBRec.ioResult)))
- (when (plusp count)
- (#_PBDTFlush pb))
- (return count))
- (let ((icon-buf-size (pref pb :DTPBRec.ioDTActCount)))
- (%stack-block ((icon-buf icon-buf-size))
- (pset pb :DTPBRec.ioDTReqCount icon-buf-size)
- (pset pb :DTPBRec.ioDTBuffer icon-buf)
- (trap-nz-echeck (#_PBDTGetIcon pb))
- (DTDB-flip-icon icon-buf icon-buf-size (pref pb :DTPBRec.ioIconType))
- (trap-nz-echeck (#_PBDTAddIcon pb))))
- (incf count)
- (incf (pref pb :DTPBRec.ioIndex)))))))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
- ;;file mgr stuff
-
- (defun path-to-FSSpec (pathname fsspec)
- (with-pstrs ((fn (mac-namestring pathname)))
- (trap-nz-echeck (#_FSMakeFSSpec 0 0 fn fsspec))))
-
- (defun clear-hasBeenInited-bit (pathname)
- (rlet ((fsspec :FSSpec)
- (fndr-info :FInfo))
- (path-to-FSSpec pathname fsspec)
- (trap-nz-echeck (#_FSpGetFInfo fsspec fndr-info))
- (pset fndr-info :FInfo.fdFlags (logand (pref fndr-info :FInfo.fdFlags) #xFEFF))
- (trap-nz-echeck (#_FSpSetFInfo fsspec fndr-info))))
-
- (defun test-hasBeenInited-bit (pathname)
- (rlet ((fsspec :FSSpec)
- (fndr-info :FInfo))
- (path-to-FSSpec pathname fsspec)
- (trap-nz-echeck (#_FSpGetFInfo fsspec fndr-info))
- (logbitp 8 (pref fndr-info :FInfo.fdFlags))))
-
- (defun touch-hasBeenInited-bit (pathname)
- (rlet ((fsspec :FSSpec))
- (path-to-FSSpec pathname fsspec)
- (with-returned-pstrs ((par-dir-name_p ""))
- (rlet ((pb :CInfoPBRec
- :ioDrDirID (pref fsspec :FSSpec.parId)
- :ioVRefNum (pref fsspec :FSSpec.vRefNum)
- :ioNamePtr par-dir-name_p
- :ioFDirIndex -1))
- (trap-nz-echeck (#_PBGetCatInfo pb))
- (pset pb :CInfoPBRec.ioDrDirId (pref pb :CInfoPBRec.ioDrParID))
- (pset pb :CInfoPBRec.ioFDirIndex 0)
- (#_GetDateTime (%inc-ptr pb (foffset :CInfoPBRec :ioDrMdDat)))
- (trap-nz-echeck (#_PBSetCatInfo pb))))))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- (defun bang-it (pathname &key (restart-p t))
- (unless pathname (setf pathname (choose-file-dialog :mac-file-type "APPL")))
- (unless (probe-file pathname) (error "~s not found."))
- (DTDB-strip-APPL (mac-file-creator pathname))
- (clear-hasBeenInited-bit pathname)
- (when restart-p (restart-Finder)))
-
- (defun flip-it (pathname &key (restart-p t))
- (rlet ((spec :FSSpec))
- (path-to-FSSpec pathname spec)
- (DTDB-vflip-APPL (mac-file-creator pathname) (pref spec :FSSpec.vRefNum)))
- (when restart-p (restart-Finder)))
-
- ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
- #|
-
- (rlet ((spec :FSSpec))
- (path-to-FSSpec "HD:" spec)
- (print-record spec :FSSpec))
-
- (flip-it (choose-file-dialog :mac-file-type "APPL") :restart-p t)
-
- |#